/*
 *    This program is free software; you can redistribute it and/or modify
 *    it under the terms of the GNU General Public License as published by
 *    the Free Software Foundation; either version 2 of the License, or
 *    (at your option) any later version.
 *
 *    This program is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *    GNU General Public License for more details.
 *
 *    2013 year
 *    Author: Esipenko Aleksey (Alexorleon)
 *    E-Mail: alexorleon@gmail.com
 */
#include "createnewqr.h"
#include "ui_createnewqr.h"
#include "genqrcode.h"
#include <QFileDialog>
#include <QDebug>

CreateNewQR::CreateNewQR(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::CreateNewQR)
{
    ui->setupUi(this);

    //--Init--
    isEmpty = false;
    idPerform = 0;
    pathfile.clear();

    createConnections();
    requestdatabase();

    ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
    ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Отмена"));
    ui->btnSelect->setEnabled(false);
    ui->btnCreate->setEnabled(false);
}

CreateNewQR::~CreateNewQR()
{
    delete ui;
}

void CreateNewQR::createConnections(){

    connect(ui->editCode,SIGNAL(textChanged()),this,SLOT(slot_countSimbols()));
    connect(ui->cmbBoxPerformer,SIGNAL(currentIndexChanged(int)),this,SLOT(slot_selectPerform()));
    connect(ui->checkFile,SIGNAL(clicked()),this,SLOT(slot_checkFile()));
    connect(ui->btnSelect,SIGNAL(clicked()),this,SLOT(slot_selectFile()));
    connect(ui->btnCreate,SIGNAL(clicked()),this,SLOT(slot_createQR()));
}

// выводим количество символов в текстовом поле
void CreateNewQR::slot_countSimbols(){
    // подсчитываем количество введенных символов
    int count(ui->editCode->toPlainText().size());
    ui->lcdNumber->display(count);

    if(count == 0){
        ui->btnCreate->setEnabled(false);
    }else{
        if( !isEmpty){
            ui->btnCreate->setEnabled(true);
        }
    }
}

void CreateNewQR::requestdatabase(){

    // заполняем списки исполнителями
    QSqlQuery queryPerform;
    queryPerform.prepare("SELECT id, performer FROM performers");
    queryPerform.exec();
    // добавляем id в качестве дополнительной информации для ускорения выборок
    while(queryPerform.next()){
        ui->cmbBoxPerformer->addItem(queryPerform.value(1).toString(), queryPerform.value(0).toInt());
    }

    // если пустые списки, то создание QR-кода запрещено
    if(ui->cmbBoxPerformer->count() == 0){
        isEmpty=true;
    }
}

void CreateNewQR::slot_selectPerform(){

    idPerform = ui->cmbBoxPerformer->itemData(ui->cmbBoxPerformer->currentIndex()).toInt();
    // при выборе выводим данные строки таблицы
    /*QSqlQuery query;
    query.prepare("SELECT id FROM performers WHERE performer=?;");
    query.addBindValue(ui->cmbBoxPerformer->currentText());
    query.exec();
    if(query.next())
    {
        idPerform = query.value(0).toInt();
    }*/
}

void CreateNewQR::slot_checkFile(){

    if(ui->checkFile->isChecked()){
        ui->btnSelect->setEnabled(true);
    }else{
        ui->btnSelect->setEnabled(false);
    }
}

void CreateNewQR::slot_selectFile(){

    pathfile.clear();
    pathfile = QFileDialog::getOpenFileName(this, tr("Выбрать файл"), "", "*.bmp *.jpg *.png");
    if( !pathfile.isEmpty()){
        ui->filePath->setStyleSheet("");
        ui->filePath->setText(pathfile);
    }
}

void CreateNewQR::slot_createQR(){

    bool result = false;
    bool isSelect = false;
    path.clear();
    // своими силами или берем сторонний файл
    if(ui->checkFile->isChecked()){
        if( !pathfile.isEmpty()){
            // копируем файл
            QDir mDir;
            QString absolutePath(mDir.absolutePath() + QDir::separator() + "images" + QDir::separator());
            QString destinationFile = absolutePath + QString::number(QDateTime::currentDateTime().toMSecsSinceEpoch()) + ".png";
            result = QFile::copy(pathfile, destinationFile);
            if(result){
                path = destinationFile;
                isSelect = true;
                listCreateImages.append(path);
            }
        }else{
            ui->filePath->setStyleSheet("background-color: rgb(255, 81, 81);");
        }
    }else{
        GenerateQRCode();
        isSelect = true;
        listCreateImages.append(path);
    }

    if(isSelect){
        // добавляем место размещения
        QSqlQuery query;
        query.prepare("INSERT INTO qrcode (date_time, status, qrpath, qrtext, performer) VALUES (?,?,?,?,?)");
        query.addBindValue(QDate::currentDate().toString(Qt::ISODate));
        query.addBindValue(tr("Создан"));
        query.addBindValue(path);
        query.addBindValue(ui->editCode->toPlainText());
        // отдельно указываем id других таблиц
        query.addBindValue(idPerform);
        query.exec();

        pathfile.clear();
        ui->filePath->clear();
        ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true);
        ui->editCode->clear();

        ui->filePath->setStyleSheet("");
    }
}

void CreateNewQR::deleteFiles(){

    QFile file;
    for(int i = 0; i < listCreateImages.count(); ++i){
        file.remove(listCreateImages.at(i));
    }
}

void CreateNewQR::GenerateQRCode(){
    int status = generateQR();
    switch (status) {
    case 0:
        // генерация прошла успешно
        qDebug()<<"generation is good";
        break;
    case 1:
        // есть пустые поля
        qDebug()<<"empty field";
        break;
    case 2:
        // такой текст уже существует
        qDebug()<<"this text is already there";
        break;
    case 3:
        // тип данных не опознан
        qDebug()<<"data type is not recognized";
        break;
    case 4:
        // недопустимая длина сообщения
        qDebug()<<"invalid message length";
        break;
    case 5:
        // неопределенное количество бит
        qDebug()<<"unspecified number of bits";
        break;
    case 6:
        // кодирование неудачно
        qDebug()<<"encoding fails";
        break;
    case 7:
        // неудачная корректировка размера по таблице
        qDebug()<<"failure by adjusting the size of the table";
        break;
    case 8:
        // неудачная генерация кода Рида-Соломона
        qDebug()<<"failure by generating of the Reed-Solomon";
        break;
    default:
        // неизвестная ошибка
        qDebug()<<"an unknown error";
        break;
    }
    // TODO: Message Пожалуйста, воспользуйтесь внешним файлом
}

int CreateNewQR::generateQR(){

    GenQRCode qrcode(ui->editCode->toPlainText());

    // Определяем тип данных
    if(qrcode.prepare() != 0){
        return 3;
    }

    // определение версии QR кода
    if(qrcode.DefineVersion() != 0){
        return 4;
    }

    // определяем количество бит
    if(qrcode.DefineNumberBits() != 0){
        return 5;
    }

    // Кодирование данных
    if(qrcode.DataEncoding() != 0){
        return 6;
    }

    // корректировка размера по таблице
    if(qrcode.LengthCorrection() != 0){
        return 7;
    }

    // генерация кода Рида-Соломона
    if(qrcode.ReedSolomon() != 0){
        return 8;
    }

    // заполнение матрицы данными изображения
    if(qrcode.ImageGeneration() != 0){
        return 9;
    }

    // получаем адрес файла
    path =  qrcode.getImagePath();
    // http://www.bti.secna.ru/education/kafedr/fitau.shtml
    // http://www.bti.secna.ru/education/kafedr/fitau.shtmlhttp://www.bti.secna.ru/education/kafedr/fitau.shtmlhttp://www.bti.secna.ru/education/kafedr/fitau.shtml
    return 0;
}
